package services

import (
	"context"
	"fmt"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"

	"zwai-app/db"
)

// UpdateUserProfile 更新用户的用户名和个人信息
//
// userID:        当前用户的 ObjectID
// username:      新用户名（传了就更新 users 表）
// age:           年龄
// gender:        性别
// birthday:      生日（time.Time），存为 ISO8601 字符串
// hobbies:       爱好
// address:       地址
// email:         邮箱
// signature:     签名
// avatarURL:     头像 URL
func UpdateUserProfile(
	ctx context.Context,
	userID primitive.ObjectID,
	username *string,
	age *int,
	gender *string,
	birthday *time.Time,
	hobbies *string,
	address *string,
	email *string,
	signature *string,
	avatarURL *string,
) error {
	// —— 1) 更新 users 表的 username —— //
	if username != nil {
		uColl := db.Client.Database(db.DBName).Collection("User")
		if _, err := uColl.UpdateOne(ctx,
			bson.M{"_id": userID},
			bson.M{"$set": bson.M{"username": *username}},
		); err != nil {
			return fmt.Errorf("更新用户名失败: %w", err)
		}
	}

	// —— 2) 更新 UserProfile 表的其他字段 —— //
	pColl := db.Client.Database(db.DBName).Collection("UserProfile")
	set := bson.M{}

	if age != nil {
		set["age"] = *age
	}
	if gender != nil {
		set["gender"] = *gender
	}
	if birthday != nil {
		// 存为 RFC3339 格式的字符串
		set["birthday"] = birthday.Format(time.RFC3339)
	}
	if hobbies != nil {
		set["hobbies"] = *hobbies
	}
	if address != nil {
		set["address"] = *address
	}
	if email != nil {
		set["email"] = *email
	}
	if signature != nil {
		set["signature"] = *signature
	}
	if avatarURL != nil {
		set["avatarUrl"] = *avatarURL
	}

	// 如果有字段要更新，就一次性写入；否则直接返回成功
	if len(set) > 0 {
		if _, err := pColl.UpdateOne(ctx,
			bson.M{"userId": userID},
			bson.M{"$set": set},
		); err != nil {
			return fmt.Errorf("更新用户个人信息失败: %w", err)
		}
	}

	return nil
}
